<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<script>
    /*
    * 装饰器：
    *   能干嘛：
    *   1.不修改源代码，直接给一个类添加功能
    *   2.给一个类组合很多功能
    *   3.动态地添加或者删除功能
    *
    *   是什么：
    *   1.为对象添加新功能
    *   2.不改变其原有的结构和功能
    *
    * */

    //一个类，目的就是为这个类添加功能
    function Monkey(){
        console.log("在一个夜黑风高的晚上，突然天降一只猴子，他是阿满")
    }
    Monkey.prototype = {
        sayName:function (){
            console.log("我是泼猴阿满")
        },
        attack:function (){
            console.log("猴拳出击")
        }
    }

    //创建一个装饰者，接收一个装饰的对象
    var Decorator = function (monkey){
        this.monkey = monkey
    }
    Decorator.prototype = {
        sayName:function (){
            this.monkey.sayName()
        },
        attack:function (){
            this.monkey.attack()
        }
    }

    //创建具体的装饰器对象
    var GoToDongHai = function (name){ //接收一个实例对象
        Decorator.call(this,name) //Decorator方法·执行，把this指向改成GoToDongHai的实例对象
    }

    var monkey = new Monkey() //生成一个实例对象monkey

    GoToDongHai.prototype = new Decorator(monkey) //将实例对象monkey传入装饰者，new装饰者生成实例对象赋值给装饰器对象

    GoToDongHai.prototype.GoldGun = function (){
        console.log("获得金箍棒，吃我一棒")
    }


    var dongHai = new GoToDongHai(monkey)

    dongHai.sayName()
    dongHai.attack()
    dongHai.GoldGun()
</script>
</body>
</html>